package com.weai.service;

import com.weai.entity.Task;
import com.weai.repository.TaskRepository;
import com.weai.util.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.context.annotation.PropertySource;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static org.apache.commons.lang3.BooleanUtils.forEach;

/**
 * 定时任务：对任务进行自动操作
 * 每周三0点 - 将上周的任务复制到本周，并将"下周计划"字段复制到"本周计划"字段
 * 每周二10点、11点、12点 - 发送周报填写提醒
 */
@Component // 启用组件扫描
@Slf4j
@PropertySource("classpath:/application.properties")
public class ScheduleBackTasksDetail {

    private final TaskRepository taskRepository;
    private final WechatNotificationService wechatNotificationService;
    

    @Autowired
    public ScheduleBackTasksDetail(TaskRepository taskRepository, WechatNotificationService wechatNotificationService) {
        this.taskRepository = taskRepository;
        this.wechatNotificationService = wechatNotificationService;
    }

    //每周三0点执行，直接使用注入的变量
    @Scheduled(cron = "${schedule.copytaskdata}")
    //每一分钟执行
//    @Scheduled(cron = "0 * * * * ?")
    public void scheduleBackTasksDetail() {
        log.info("开始执行定时任务，更新任务，将每个任务的下周计划，填写到本周任务中");
        
        // 获取当前和上周的日期范围
        Map<String, LocalDate> dateRange = DateUtils.getCurrentAndLastWeekDateRange();
        LocalDate startOfWeek = dateRange.get("startOfWeek");
        LocalDate endOfWeek = dateRange.get("endOfWeek");
        LocalDate startOfLastWeek = dateRange.get("startOfLastWeek");
        LocalDate endOfLastWeek = dateRange.get("endOfLastWeek");

        // 查询所有period_end_date是上周的任务
        List<Task> allByPeriodEndDateBetween = taskRepository.findAllByPeriodEndDateBetween(startOfLastWeek, endOfLastWeek);
        if (allByPeriodEndDateBetween.isEmpty()) {
            log.info("没有需要更新的任务！");
        } else {
            log.info("需要更新的任务数量为：{}", allByPeriodEndDateBetween.size());
            allByPeriodEndDateBetween.forEach(task -> {
                // 更新任务的period_end_date和period_start_date为本周的日期
                task.setPeriodEndDate(endOfWeek);
                task.setPeriodStartDate(startOfWeek);
                // 将上周的任务的next_week_plan字段，填充到本周的任务的this_week_plan字段中，同时将next_week_plan字段清空，id字段也清空，其他字段不变
                task.setThisWeekPlan(task.getNextWeekPlan());
                task.setNextWeekPlan(null);
                task.setId(null);
                // 保存任务
                taskRepository.save(task);
                log.info("任务{},---> {} 的下周计划已更新", task.getId(),task.getTitleIndex());
            });
            log.info("定时任务执行完成,数量为：{}", allByPeriodEndDateBetween.size());
        }
    }
    
    /**
     * 每周二10点、11点、12点各执行一次，获取当前自然周内未填写周报的人员，并发送通知
     * 直接使用注入的变量
     */
   @Scheduled(cron = "${schedule.wechatsendmsg}")
    // @Scheduled(cron = "0 * * * * ?")
    public void notifyWeeklyReportReminder() {
        log.info("开始执行定时任务，获取当前自然周内未填写周报的人员，并发送通知");
        
        // 获取当前周的周一和周日日期
        Map<String, LocalDate> dateRange = DateUtils.getCurrentAndLastWeekDateRange();
        LocalDate startOfWeek = dateRange.get("startOfWeek");
        LocalDate endOfWeek = dateRange.get("endOfWeek");
        
        // 查询当前周内未填写周报的任务（nextWeekPlan为空且status为inProgress）
        List<Task> unfinishedTasks = taskRepository.findAllUsers2Notes(startOfWeek, endOfWeek);
        
        int notificationCount = 0;
        for (Task task : unfinishedTasks) {
            // 检查任务是否符合条件：nextWeekPlan为空且status为inProgress
            if (task.getNextWeekPlan() == null && "inProgress".equals(task.getStatus())) {
                String receiver = task.getReceiver();
                if (receiver != null && !receiver.isEmpty()) {
                    // 从receiver中提取用户名
                    String[] receivers = receiver.split("\\|");
                    for (String userInfo : receivers) {
                        // 提取用户英文名（格式可能是：admin/管理员）
                        String englishName = userInfo.split("/")[0];
                        if (englishName != null && !englishName.isEmpty()) {
                            // 发送通知
                            String content = "服务助手提醒：\n 请及时登录系统，更新本周工作內容，18点前将自动发送周报，谢谢配合~~~ \n\n 需求名称：  " + task.getTitle() + " \n\n http://10.107.102.153:8080/ \n";
                            wechatNotificationService.sendNotification(englishName.trim(), content);
                            notificationCount++;
                            log.info("成功向用户 {} 发送周报填写提醒....", englishName);
                        }
                    }
                }
            }
        }
        
        log.info("周报填写提醒任务执行完成，共发送 {} 条提醒", notificationCount);
    }
}
